package com.fruit.service.thread;

import com.fruit.bean.entity.fruit.FruitUserOrderInfo;
import com.fruit.bean.enumeration.fruit.FruitUserOrderStatusEnum;
import com.fruit.service.fruit.FruitUserOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 *  此线程每十秒查询一次订单状态（只查询已支付和运输中的订单）。
 *  如果有已支付的订单，自动改为运输中。
 *  如果有运输中的订单，并且判断订单修改时间，如果已经超过十秒，则更新为待评论（默认已收货）。
 *
 */
@Component
@Slf4j
public class OrderStatusThread extends Thread{

    @Autowired
    private FruitUserOrderService orderService;

    @Override
    public void run() {
        log.info("启动自动发货线程....");
        try {
            while (true) {
                Thread.sleep(10000L);
                List<FruitUserOrderInfo> userOrderInfoList = orderService.listUnRecievedOrder();
                for(FruitUserOrderInfo userOrderInfo : userOrderInfoList){
                    if(userOrderInfo.getUserOrderStatus().equals(FruitUserOrderStatusEnum.PAID.getCode())){
                        // 已支付的订单，自动改为运输中。
                        userOrderInfo.setUserOrderStatus(FruitUserOrderStatusEnum.TRANSFORM.getCode());
                        userOrderInfo.setUserOrderUpdateTime(new Date());
                        orderService.updateOrderInfo(userOrderInfo);
                    }else if(userOrderInfo.getUserOrderStatus().equals(FruitUserOrderStatusEnum.TRANSFORM.getCode())){
                        //运输中的订单，判断订单修改时间，如果已经超过十秒，则更新为待收货
                        if((System.currentTimeMillis() - userOrderInfo.getUserOrderUpdateTime().getTime()) > (10*1000L)){
                            userOrderInfo.setUserOrderStatus(FruitUserOrderStatusEnum.WAIT_RECIEVE.getCode());
                            userOrderInfo.setUserOrderUpdateTime(new Date());
                            orderService.updateOrderInfo(userOrderInfo);
                        }
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}